home *** CD-ROM | disk | FTP | other *** search
- ///--------------------------------------------------------------------------------------
- // Application.c
- //
- // By: Tony Myles
- //
- // Extensive modifications by Karl Bunker
- //
- ///--------------------------------------------------------------------------------------
-
-
- #ifndef __GESTALTEQU__
- #include <Gestalt.h>
- #endif
-
- #ifndef __PALETTES__
- #include <Palettes.h>
- #endif
-
-
- #include <SWIncludes.h> // Automatically include all SpriteWorld.h files
- #include <SWGameUtils.h>
- #include <SWDialogUtils.h>
- #include <SWApplication.h>
-
- #if __MWERKS__
- #include <profiler.h>
- #endif
-
- #include "Application.h"
- #include "SpriteTest.h"
- #include "About.h"
-
- #define kWindowInsetH 0 // modify to test windows smaller than 640x480 screen size
- #define kWindowInsetV 0
-
- SpriteTestPtr gSpriteTestP = NULL;
-
- static Boolean gDone = false;
- static Boolean gInBackGround = false;
- static WindowPtr gWindowP = NULL;
-
- extern Boolean gGlobesVisible;
- extern Boolean gTitleVisible;
- extern Boolean gCollisionDetection;
-
-
- /******************** main ********************/
- void main(void)
- {
- /*
- ProfilerInit( collectDetailed, bestTimeBase, 100, 40 );
- ProfilerSetStatus( false );
- */
- Initialize(2);
-
- CreateMenuBar();
- CreateWindow();
-
- EnterApplication();
- ServiceEvents();
-
- ExitApplication();
- ExitToShell();
- }
-
-
- /******************** CreateMenuBar ********************/
- void CreateMenuBar(void)
- {
- Handle menuBarH;
-
- menuBarH = GetNewMBar(kMenuBarResID);
-
- if (menuBarH != NULL)
- {
- SetMenuBar(menuBarH);
- AppendResMenu(GetMenuHandle(kAppleMenuID), 'DRVR');
- DrawMenuBar();
- }
- else
- {
- CantFindResource();
- }
- }
-
-
- /******************** CreateWindow ********************/
- void CreateWindow(void)
- {
- Rect monitorRect;
- short windowInsetH = kWindowInsetH;
- short windowInsetV = kWindowInsetV;
-
-
- gWindowP = GetNewCWindow(kMyWindowResID, NULL, (WindowPtr)-1L);
-
- if (gWindowP != NULL)
- {
- monitorRect = (*GetMainDevice())->gdRect;
-
- SizeWindow(gWindowP, (monitorRect.right-monitorRect.left),
- (monitorRect.bottom-monitorRect.top), false);
-
- if ( (monitorRect.right-monitorRect.left) > 640 )
- windowInsetH += ((monitorRect.right-monitorRect.left) - 640)/2;
- if ( (monitorRect.bottom-monitorRect.top) > 480 )
- windowInsetV += ((monitorRect.bottom-monitorRect.top) - 480)/2;
-
- SizeWindow(gWindowP, (monitorRect.right-monitorRect.left) - (windowInsetH*2),
- (monitorRect.bottom-monitorRect.top) - (windowInsetV*2), false);
-
- MoveWindow(gWindowP, monitorRect.left + windowInsetH,
- monitorRect.top + windowInsetV, false);
- }
- else
- {
- CantFindResource();
- }
- }
-
-
- /******************** EnterApplication ********************/
- void EnterApplication(void)
- {
- OSErr err = noErr;
-
-
- err = SWEnterSpriteWorld();
- FatalError(err);
-
- err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
- FatalError(err);
-
- ShowWindow(gWindowP);
- UpdateSpriteTest(gSpriteTestP, gWindowP);
- ValidRect(&gWindowP->portRect);
- }
-
-
- /******************** ExitApplication ********************/
- void ExitApplication(void)
- {
-
- DisposeSWStuff(gSpriteTestP);
- SWExitSpriteWorld();
-
- DisposeWindow(gWindowP);
- }
-
-
- /******************** ServiceEvents ********************/
- void ServiceEvents(void)
- {
- Boolean haveEvent;
- EventRecord event;
- long sleepTime;
-
- while (!gDone)
- {
- sleepTime = gInBackGround ? kBackGroundSleepTime : kForeGroundSleepTime;
- haveEvent = WaitNextEvent(everyEvent, &event, sleepTime, NULL);
-
- if (haveEvent)
- {
- DispatchEvent(&event);
- }
- else
- {
- HandleNullEvent();
- }
- }
- }
-
-
- /******************** DispatchEvent ********************/
- void DispatchEvent(
- EventRecord* event)
- {
- switch(event->what)
- {
- case mouseDown:
- HandleMouseEvent(event);
- break;
- case mouseUp:
- break;
- case keyUp:
- break;
- case keyDown:
- case autoKey:
- HandleKeyEvent((char)(event->message & charCodeMask), event->modifiers);
- break;
- case updateEvt:
- HandleUpdateEvent((WindowPtr)event->message);
- break;
- case diskEvt:
- break;
- case activateEvt:
- break;
- case osEvt:
- HandleOSEvent(event->message);
- break;
- case kHighLevelEvent:
- break;
- default:
- break;
- }
- }
-
-
- /******************** HandleMouseEvent ********************/
- void HandleMouseEvent(
- EventRecord* event)
- {
- WindowPtr whichWindow;
- short partCode;
-
- partCode = FindWindow(event->where, &whichWindow);
-
- switch (partCode)
- {
- case inDesk:
- break;
- case inMenuBar:
- AdjustMenuItems();
- HandleMenuCommand(MenuSelect(event->where));
- break;
- case inSysWindow:
- SystemClick(event, whichWindow);
- break;
- case inContent:
- RemoveClickedSprite( gSpriteTestP );
- break;
- case inDrag:
- break;
- case inGrow:
- break;
- case inGoAway:
- break;
- case inZoomIn:
- case inZoomOut:
- break;
- default:
- break;
- }
- }
-
-
- /******************** HandleKeyEvent ********************/
- void HandleKeyEvent(
- char key,
- short modifiers)
- {
-
- if ((modifiers & cmdKey) != 0)
- {
- AdjustMenuItems();
- HandleMenuCommand(MenuKey(key));
- }
- else
- {
- // if the spacebar is hit, fill the screen with black
- // useful for debugging purposes
- if (key == ' ')
- {
- FillRect(&gSpriteTestP->spriteWorldP->windowFrameP->frameRect, &qd.black);
- }
- }
- }
-
-
- /******************** HandleUpdateEvent ********************/
- void HandleUpdateEvent(
- WindowPtr updateWindowP)
- {
- GDHandle windowGDH;
- OSErr err;
-
- if (updateWindowP == gWindowP)
- {
- SetPort(updateWindowP);
- windowGDH = GetMaxDevice( &updateWindowP->portRect );
-
- // has the depth been changed?
- if ( GetGDeviceDepth(windowGDH) != gSpriteTestP->spriteWorldP->pixelDepth )
- { // if so, rebuild SpriteWorld
- DisposeSWStuff(gSpriteTestP);
- err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
- FatalError(err);
- }
- BeginUpdate(updateWindowP);
-
- UpdateSpriteTest(gSpriteTestP, updateWindowP);
-
- EndUpdate(updateWindowP);
- }
- }
-
-
- /******************** HandleOSEvent ********************/
- void HandleOSEvent(
- long message)
- {
- if ((message >> 24) == suspendResumeMessage)
- {
- if ((message & resumeFlag) != 0)
- {
- gInBackGround = false;
- }
- else
- {
- gInBackGround = true;
- }
- }
- }
-
-
- /******************** HandleNullEvent ********************/
- void HandleNullEvent(void)
- {
- SpriteTestIdle(gSpriteTestP);
- }
-
-
- /******************** HandleMenuCommand ********************/
- void HandleMenuCommand(
- long menuItemIdentifier)
- {
- short menuIdent = HiWord(menuItemIdentifier);
- short menuItem = LoWord(menuItemIdentifier);
-
- switch (menuIdent)
- {
- case kAppleMenuID:
- HandleAppleMenuCommand(menuItem);
- break;
-
- case kFileMenuID:
- HandleFileMenuCommand(menuItem);
- break;
-
- case kEditMenuID:
- HandleEditMenuCommand(menuItem);
- break;
-
- case kSpriteMenuID:
- HandleSpriteMenuCommand(menuItem);
- break;
-
- case kTestMenuID:
- HandleTestMenuCommand(menuItem);
- break;
- }
- HiliteMenu(0);
- }
-
-
- /******************** HandleAppleMenuCommand ********************/
- void HandleAppleMenuCommand(
- short menuItem)
- {
- Str255 deskAccName;
-
- switch (menuItem)
- {
- case kAboutItem:
- DisplayAboutBox();
- break;
-
- default:
- GetMenuItemText(GetMenuHandle(kAppleMenuID), menuItem, deskAccName);
- OpenDeskAcc(deskAccName);
- break;
- }
- }
-
-
- /******************** HandleFileMenuCommand ********************/
- void HandleFileMenuCommand(
- short menuItem)
- {
- switch (menuItem)
- {
- case kQuitItem:
- gDone = true;
- break;
- }
- }
-
- /******************** HandleEditMenuCommand ********************/
- void HandleEditMenuCommand(
- short menuItem)
- {
- (void)SystemEdit(menuItem);
- }
-
-
- /******************** HandleSpriteMenuCommand ********************/
- void HandleSpriteMenuCommand(
- short menuItem)
- {
- switch (menuItem)
- {
- case kCreateSpriteItem:
- HandleCreateSpriteCommand(gSpriteTestP);
- break;
-
- case kHideTitleItem:
- HandleSpriteTestTitleCommand(gSpriteTestP);
- break;
-
- case kHideBallsItem:
- HandleBouncingBallsCommand(gSpriteTestP);
- break;
- }
- }
-
-
- /******************** HandleTestMenuCommand ********************/
- void HandleTestMenuCommand(
- short menuItem)
- {
- switch (menuItem)
- {
- case kRunTestItem:
- RunTheTest( gSpriteTestP );
- break;
-
- case kSetUpTestItem:
- SetUpTestDialog( gSpriteTestP );
- break;
-
- case kCollisionDetectionItem:
- gCollisionDetection = !gCollisionDetection;
- break;
-
- case kMonitorDepthItem:
- MonitorDepthDialog();
- break;
- }
- }
-
-
- /******************** AdjustMenuItems ********************/
- void AdjustMenuItems(void)
- {
- MenuHandle tempMenuH;
-
- // adjust the sprite menu
- tempMenuH = GetMenuHandle(kSpriteMenuID);
-
- CheckItem(tempMenuH, kHideTitleItem, gTitleVisible);
- CheckItem(tempMenuH, kHideBallsItem, gGlobesVisible);
-
- // adjust the test menu
- tempMenuH = GetMenuHandle(kTestMenuID);
-
- CheckItem(tempMenuH, kCollisionDetectionItem, gCollisionDetection);
-
- }
-
-
- /******************** MonitorDepthDialog ********************/
- void MonitorDepthDialog(void)
- {
- GrafPtr savePort;
- DialogPtr theDialog;
- short itemHit;
- GDHandle windowGDH;
- short originalDepth, requestedDepth;
- Boolean done = false;
- OSErr err = noErr;
-
-
- GetPort( &savePort );
-
- theDialog = GetNewDialog(kMonitorDepthResID, nil, (WindowPtr)-1L);
-
- SetDialogDefaultItem( theDialog, ok );
- SetDialogCancelItem( theDialog, cancel );
-
- windowGDH = GetMaxDevice( &theDialog->portRect );
-
- originalDepth = requestedDepth = GetGDeviceDepth(windowGDH);
-
- // Check if monitor can display these depths
- SetDItemHilite( theDialog, k1BitDepthButton, HasDepth(windowGDH, 1, 0, 0) );
- SetDItemHilite( theDialog, k4BitDepthButton, HasDepth(windowGDH, 4, 0, 0) );
- SetDItemHilite( theDialog, k8BitDepthButton, HasDepth(windowGDH, 8, 0, 0) );
- SetDItemHilite( theDialog, k16BitDepthButton, HasDepth(windowGDH, 16, 0, 0) );
- SetDItemHilite( theDialog, k32BitDepthButton, HasDepth(windowGDH, 32, 0, 0) );
-
- SetMonitorDepthButtons( theDialog, originalDepth );
-
- ShowWindow( theDialog );
-
- while ( !done )
- {
- ModalDialog( nil, &itemHit );
- switch( itemHit )
- {
- case k1BitDepthButton:
- requestedDepth = 1;
- SetMonitorDepthButtons( theDialog, requestedDepth );
- break;
- case k4BitDepthButton:
- requestedDepth = 4;
- SetMonitorDepthButtons( theDialog, requestedDepth );
- break;
- case k8BitDepthButton:
- requestedDepth = 8;
- SetMonitorDepthButtons( theDialog, requestedDepth );
- break;
- case k16BitDepthButton:
- requestedDepth = 16;
- SetMonitorDepthButtons( theDialog, requestedDepth );
- break;
- case k32BitDepthButton:
- requestedDepth = 32;
- SetMonitorDepthButtons( theDialog, requestedDepth );
- break;
- case ok:
- case cancel:
- done = true;
- break;
- }
- }
- DisposeDialog( theDialog );
- SetPort( savePort );
-
- if ( itemHit == ok )
- {
- DisposeSWStuff(gSpriteTestP);
- // can we do colors?
- if ( HasDepth(windowGDH, requestedDepth, 1, 1) )
- (void)SetDepth( windowGDH, requestedDepth, 1, 1 );
- // if not, settle for greyscale
- else
- (void)SetDepth( windowGDH, requestedDepth, 1, 0 );
-
- err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
- FatalError(err);
- }
- }
-
-
- /******************** SetMonitorDepthButtons ********************/
- void SetMonitorDepthButtons(
- DialogPtr theDialog,
- short theDepth)
- {
- SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k1BitDepthButton), (theDepth == 1) );
- SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k4BitDepthButton), (theDepth == 4) );
- SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k8BitDepthButton), (theDepth == 8) );
- SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k16BitDepthButton), (theDepth == 16) );
- SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k32BitDepthButton), (theDepth == 32) );
- }
-
-